// 组件的生命周期
// 
/**
 * 1、组件创建阶段的：创建阶段的生命周期在组件中的一辈子中只执行一次
 * 2、组件的运行阶段：组件的state和props的改变有选择性的执行0或多次
 * 3、组件的销毁阶段：一辈子只执行一次
 * 细分析创建阶段：
 * (1)、static defaultProps=[]  
 * 这是初始化props属性默认值的，防止组件中某些必须的属性外界没有传入
 * (2)、this.state={}   初始化state
 * 这是初始化私有数据的，它定义在组件constructor的构造器函数中，所以this.state会在第一时间被初始化
 * 因为在class类只要new就会被调用constructor构造器,
 * ----创建时期的生命周期函数 
 *  this.state={}-->componentWillMount--->render--->componentDidMount
 *  componentWillMount   组件将要挂载
 * 这个函数是组件的虚拟DOM元素将要挂载到页面上的时候能执行，此时虚拟DOM还没有被创建，也没有挂载到页面上
 * 因为虚拟DOM是在random函数上创建的，所以此时还没有虚拟DOM
 * render                渲染虚拟DOM
 * 当进行到random函数执行的时候，就已经开始渲染虚拟DOM，random执行完，我们的虚拟DOM也就在内存中
 * 创建好了，此时，我们的虚拟DOM并没有真正挂载到页面上
 * componentDidMount     组件完全挂载
 * 我们的虚拟DOM已经挂载完，此时，我们的state和内存中的虚拟DOM，已经浏览器中的页面已经保持完全一致
 * 到这里，组件创建阶段的生命周期函数，已经完全执行完，页面第一次被渲染好
 * 
 * ---组件进行阶段的生命周期函数
 * 如果state改变了，那么进入shouldComponentUpdate，如果Props改变了,那么componentWillReceiveProps
 * ,再到shouldComponentUpdate
 * 如果组件需要更新，进入componentWillUpdate-->render-->componentDidUpdate
 * componentWillReceiveProps
 * 通过状态属性的改变能走触发组件的更新，组件将要接受props属性，只有外界的props触发了才开始这个钩子函数
 * shouldComponentUpdate
 * 组件是否需要更新
 * componentWillUpdate
 * 组件将要更新
 * render
 * 重新渲染虚拟DOM，当render渲染完，虚拟DOM已经和state保持一致了，都是最近数据，但是页面还是旧的
 * componentDidUpdate
 * 组件已经完成了更新，此时页面也是最新的
 * 
 * ---组件的销毁阶段
 * componentWillUncount
 * 这个钩子函数组件可被使用，还没有还是卸载，
 * 
 * 只有这几个处于运行期间的钩子函数才有形参值
 * componentWillReceiveProps(nextProps)
 * shouldComponentUpdate(nextProps,nextState)
 * componentWillUpdate(nextProps,nextState)
 * componentDisUpdate(prevProps,PrevState)
 */